HJS

매핑된 타입 (Mapped Types)

매핑된 타입은 TypeScript에서 기존 객체 타입을 기반으로 새로운 타입을 동적으로 생성할 수 있게 해주는 강력한 기능입니다.
keyof, in, T[K]등의 키워드를 조합하여 타입의 각 속성에 대해 일괄적인 변형, 속성 필터링, 속성 추가/삭제 등을 할 수 있습니다.

1️⃣ 매핑된 타입의 기본 개념

🔹 keyof - 키 추출

keyof객체 타입의 모든 키를 유니언 타입으로 추출하는 연산자입니다.

🧐 예시

type Person = {
  name: string;
  age: number;
};

type Keys = keyof Person; // 결과: 'name' | 'age'

✔️ keyof는 객체 타입의 키들을 유니언 문자열 리터럴 타입으로 추출합니다.


🔹 in - 반복적인 매핑

type Mapped<T> = {
  [K in keyof T]: T[K];
};

✔️ in은 유니언 타입으로 추출된 키들을 순회하며 각각의 키에 대해 원하는 처리를 적용합니다.


🔹 T[K] - 인덱싱 타입

type ValueOfName = Person["name"]; // 결과: string

✔️ T[K]는 키 K에 해당하는 속성 값 타입을 가져옵니다.



2️⃣ 매핑된 타입 예시

🔹 모든 프로퍼티를 선택적(?)로 만들기

type Optional<T> = { [K in keyof T]?: T[K] }
type Person = { name: string; age: number; };
type OptionalPerson = Optional<Person>;
// 결과: { name?: string; age?: number; }

🔹 모든 프로퍼티를 읽기 전용(readonly)으로 만들기

type ReadOnly<T> = { readonly [K in keyof T]: T[K] }
type Person = { name: string; age: number; };
type ReadOnlyPerson = ReadOnly<Person>;
// 결과: { readonly name: string; readonly age: number; }

🔹 선택적 프로퍼티만 추출하기 선택적 프로퍼티만 추출

type ExtractOptional<T> = { 
    [K in typeof T] : T[K]
}
type Obj = { name: string; age?: number; isActive?: boolean; };
type OptionalProps = ExtractOptional<Obj>;
// 결과: 'age' | 'isActive'